package com.hsgene.order.persistence;

import com.hsgene.common.util.support.LimitHelper;
import com.hsgene.common.util.support.OrderHelper;
import com.hsgene.mq.DcwImageModel;
import com.hsgene.order.condition.DistributeOrderCondition;
import com.hsgene.order.condition.GeneticTestingOrderCondition;
import com.hsgene.order.domain.OrderPackageDetail;
import com.hsgene.order.domain.disease.GeneOrder;
import com.hsgene.order.domain.reserve.GeneticCompletePatientInfo;
import com.hsgene.order.domain.v1.*;
import com.hsgene.order.dto.OrderSumPriceCommission;
import com.hsgene.order.dto.SelectForInsertDoctorOrderModel;
import com.hsgene.order.dto.agency.SimpleAgencySampleDto;
import com.hsgene.order.dto.console.ConsoleOrderInterchangeDto;
import com.hsgene.order.dto.console.DistributeOrderDetailInfoDto;
import com.hsgene.order.dto.console.DistributeOrdersDto;
import com.hsgene.order.dto.console.OrderUpdateRealPriceDto;
import com.hsgene.order.dto.doctor.OrderLogisticsInfoDto;
import com.hsgene.order.dto.doctor.OrderProductLogisticsInfoDto;
import com.hsgene.order.dto.doctor.SimpleDoctorDto;
import com.hsgene.order.dto.doctor.SimpleDoctorServantDto;
import com.hsgene.order.dto.peanut.*;
import com.hsgene.order.dto.v1.GeneticTestingExpressDeliveryDto;
import com.hsgene.order.dto.v1.UploadDcwDetailsDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 订单Repository
 *
 * @author wangbing
 * @version 1.0, 2018/9/18
 */
@Repository
public interface OrderRepository {

    /**
     * @param orderId 订单id
     * @return int
     * @description 获取患者信息确认状态
     * @author maodi
     * @createDate 2018/10/31 9:18
     */
    Integer getPatientInfoConfirm(@Param("orderId") String orderId);

    /**
     * 获取符合查询条件对应的订单数量
     *
     * @param condition 查询条件
     * @return 符合条件的数量
     */
    int getConditionCount(@Param("condition") GeneticTestingOrderCondition condition);

    /**
     * 查询符合条件的订单列表
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 订单列表
     */
    List<TestingOrderDto> queryConditionOrder(
            @Param("condition") GeneticTestingOrderCondition condition,
            @Param("orderHelper") OrderHelper orderHelper,
            @Param("limitHelper") LimitHelper limitHelper);

    /**
     * 查询符合条件的订单列表
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 订单列表
     */
    List<GeneticTestingOrder> queryOrders(
            @Param("condition") GeneticTestingOrderCondition condition,
            @Param("orderHelper") OrderHelper orderHelper,
            @Param("limitHelper") LimitHelper limitHelper);

    /**
     * 根据id查询订单信息
     *
     * @param id 订单id
     * @return 订单信息
     */
    GeneticTestingOrder findById(@Param("id") String id);

    /**
     * 根据编号查询订单信息
     *
     * @param orderNo 订单编号
     * @return 订单信息
     */
    GeneticTestingOrder findByOrderNo(@Param("orderNo") String orderNo);

    /**
     * 根据订单id查询订单附加信息A
     *
     * @param orderId 订单id
     * @return 订单附加信息A
     */
    GeneticTestingOrderAddtionA findAddtionAByOrderId(@Param("orderId") String orderId);

    /**
     * 根据订单id查询订单附加信息B
     *
     * @param orderId 订单id
     * @return 订单附加信息B
     */
    GeneticTestingOrderAddtionB findAddtionBByOrderId(@Param("orderId") String orderId);

    /**
     * 查询订单的套餐更换信息
     *
     * @param orderId 订单id
     * @return 订单的套餐更换信息
     */
    GeneticTestingOrderInterchange findHandlingInterchangeByOrderId(@Param("orderId") String orderId);

    /**
     * 根据id查询变更信息
     *
     * @param interchangeId 变更id
     * @return 变更信息
     */
    GeneticTestingOrderInterchange findInterchangeById(@Param("interchangeId") String interchangeId);

    /**
     * 查询订单使用的耗材
     *
     * @param orderId 订单id
     * @return 使用耗材列表
     */
    List<GeneticTestingGoodsConsume> queryOrderGoodsConsumes(@Param("orderId") String orderId);

    /**
     * 查询订单关联DCW
     *
     * @param orderId 订单id
     * @return 关联DCW
     */
    GeneticTestingOrderDcw findOrderDcw(@Param("orderId") String orderId);

    /**
     * 查询订单关联检测单
     *
     * @param orderId 订单id
     * @return 关联检测单列表
     */
    List<GeneticTestingOrderRequisition> queryOrderRequisition(@Param("orderId") String orderId);

    /**
     * 更新检测单患者信息
     *
     * @param id               id
     * @param newOrderNo       新订单号
     * @param orderInfo        信息
     * @param patientInfo      患者信息
     * @param createTime       订单创建时间
     * @param updateTime       完善时间
     * @param status           订单状态
     * @param sum              总金额
     * @param firstSingleAward 首单奖励(0-不满足首单奖励,1-首单奖励未发,2-首单奖励已发)
     * @param doctorName
     * @param doctorPhone
     */
    void updateMainTestingOrder(@Param("id") String id, @Param("newOrderNo") String newOrderNo,
                                @Param("orderInfo") DifuCreateOrderInfoDto orderInfo,
                                @Param("patient") GeneticCompletePatientInfo patientInfo,
                                @Param("createTime") Date createTime,
                                @Param("updateTime") Date updateTime, @Param("status") int status,
                                @Param("sum") OrderSumPriceCommission sum,
                                @Param("firstSingleAward") Integer firstSingleAward,
                                @Param("doctorName") String doctorName, @Param("doctorPhone") String doctorPhone);

    /**
     * 逻辑删除旧id
     *
     * @param orderId    旧订单Id
     * @param updateTime 更新时间
     */
    void deleteOldOrder(@Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * 获取旧的套餐id
     *
     * @param oldOrderId 订单id
     * @return
     */
    String getOldPackageIds(@Param("orderId") String oldOrderId);

    /**
     * 获取旧订单总价
     *
     * @param oldOrderId 旧订单ID
     * @return
     */
    Double getOldOrderPrice(@Param("oldOrderId") String oldOrderId);

    /**
     * 变更记录
     *
     * @param id               表id
     * @param oldOrderId       旧订单id
     * @param newOrderId       新订单id
     * @param oldPackageIds    旧套餐id
     * @param newPackageIds    新套餐id
     * @param differencePrices 差价
     * @param updateTime       时间
     * @param payerType        支付类型
     * @param images           样本图片
     * @param remarks          备注
     * @param recordNo         变更记录编号
     */
    void recordChangeHistory(@Param("id") String id, @Param("oldOrderId") String oldOrderId,
                             @Param("newOrderId") String newOrderId, @Param("oldPackageIds") String oldPackageIds,
                             @Param("newPackageIds") String newPackageIds, @Param("differencePrices") double
                                     differencePrices, @Param("updateTime") Date updateTime,
                             @Param("payerType") Integer payerType, @Param("images") String images,
                             @Param("remarks") String remarks, @Param("recordNo") String recordNo);

    /**
     * 新完善信息插入订单A表
     *
     * @param newOrderId        新订单ID
     * @param clinicalDiagnosis 临床诊断
     * @param userId            地服ID
     * @param createTime
     * @param updateTime        时间
     * @param diseaseIds        疾病
     * @param diseaseNames      疾病名
     */
    void inserOrderA(@Param("newOrderId") String newOrderId, @Param("clinicalDiagnosis") String clinicalDiagnosis,
                     @Param("userId") String userId, @Param("createTime") Date createTime,
                     @Param("updateTime") Date updateTime,
                     @Param("diseaseIds") String diseaseIds, @Param("diseaseNames") String diseaseNames);

    /**
     * B表插入数据
     *
     * @param newOrderId  新订单ID
     * @param oldPrice    原始价格
     * @param patientInfo 患者信息
     * @param payerType   支付类型
     */
    void inserOrderB(@Param("newOrderId") String newOrderId, @Param("oldPrice") double oldPrice,
                     @Param("patientInfo") GeneticCompletePatientInfo patientInfo,
                     @Param("payerType") Integer payerType);

    /**
     * 套餐信息插入
     *
     * @param newOrderId      新订单id
     * @param productInfoList 套餐信息
     */
    void inserOrderPackage(@Param("newOrderId") String newOrderId,
                           @Param("productInfoList") List<OrderCompleteProductInfo> productInfoList);

    /**
     * 插入医生订单表
     *
     * @param newOrderId     订单
     * @param remarks        备注
     * @param newPackageList 套餐id
     * @param updateTime     时间
     * @param newPackageIds
     */
    void inserDoctorOrder(@Param("newOrderId") String newOrderId, @Param("remarks") String remarks,
                          @Param("newPackageList") List<String> newPackageList, @Param("updateTime") Date updateTime,
                          @Param("newPackageIds") String newPackageIds, @Param("model")
                                  SelectForInsertDoctorOrderModel model);

    List<SelectForInsertDoctorOrderModel> selectForInsertDoctorOrder(@Param("newPackageList") List<String>
                                                                             newPackageList);

    /**
     * 使用耗材信息
     *
     * @param goodsInfoList 耗材信息
     * @param newOrderId    新订单ID
     * @param updateTime    时间
     */
    void insertOrderGoodsConsume(@Param("goodsInfoList") List<GeneticOrderGoodsInfoDto> goodsInfoList,
                                 @Param("newOrderId") String newOrderId, @Param("updateTime") Date updateTime);

    /**
     * 校验样本条码是否以存在
     *
     * @param sampleBarcode 样本条码
     * @param oldOrderId
     * @return
     */
    Integer checkSampleBarCodeIsExists(@Param("sampleBarcode") String sampleBarcode,
                                       @Param("oldOrderId") String oldOrderId);

    /**
     * 查找医生信息
     *
     * @param doctorId 医生id
     * @return 医生信息
     */
    SimpleDoctorDto findDoctor(@Param("doctorId") String doctorId);

    /**
     * 查询地服信息
     *
     * @param groundServantId 地服id
     * @return 地服信息
     */
    SimpleDoctorServantDto findServant(@Param("groundServantId") String groundServantId);

    /**
     * 查询样本列表
     *
     * @param ids ids
     * @return 样本列表
     */
    List<SimpleAgencySampleDto> queryAgencySamples(@Param("ids") String ids);

    /**
     * 更新订单支付相关状态，主要用于支付成功更新订单状态和订单支付状态
     *
     * @param testingOrder 订单信息
     */
    void updateOrderPaymentStatus(@Param("testingOrder") GeneticTestingOrder testingOrder);

    /**
     * 生成订单支付信息，更新相关信息
     *
     * @param testingOrder 订单信息
     */
    void updateOrderChargeStatus(@Param("testingOrder") GeneticTestingOrder testingOrder);

    /**
     * 删除医生记录
     *
     * @param orderId    旧id
     * @param updateTime 时间
     */
    void deleteDoctorOldOrder(@Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * jcl
     * 线下付款弹窗信息
     *
     * @param id 订单id
     * @return
     */
    TestingOrderDto underLinePaymentInfo(@Param("id") String id);

    /**
     * jcl
     * 订单状态更新
     *
     * @param id     订单id
     * @param status 状态
     */
    void updateTestingOrderStatus(@Param("id") String id, @Param("status") int status, @Param("updateTime") Date
            updateTime);

    /**
     * jcl
     * 订单状态更新
     *
     * @param id           订单id
     * @param status       状态
     * @param chargeStatus 支付状态
     * @param updateTime   更新时间
     */
    void updateOrderForUnderlinePay(
            @Param("id") String id,
            @Param("status") int status,
            @Param("chargeStatus") String chargeStatus,
            @Param("updateTime") Date updateTime);

    /***
     * 保存线下收款支付信息
     * @author jcl
     * @date 2018/11/15 10:34
     * @param orderPayment
     * @return
     */
    void insertOrderPayMent(GeneticTestingOrderPayment orderPayment);

    /**
     * jcl
     * 保存线下收款填写的信息
     *
     * @param orderB
     */
    void updateTestingOrderAddTionB(@Param("orderB") GeneticTestingOrderAddtionB orderB);

    /**
     * 更新套餐快递信息
     *
     * @param expressDeliveryInfo 套餐物流信息
     * @param orderId             订单id
     */
    void updateOrderPackageExpress(@Param("expressList") List<GeneticTestingExpressDeliveryDto>
                                           expressDeliveryInfo, @Param("orderId") String orderId);

    /**
     * 更新订单中样本图片
     *
     * @param orderId             订单ID
     * @param sampleImages        样本图片
     * @param expressReturnImages 快递回单图片
     * @param updateTime          时间
     */
    void updateOrderSampleImages(@Param("orderId") String orderId, @Param("sampleImages") String sampleImages,
                                 @Param("expressReturnImages") String expressReturnImages,
                                 @Param("updateTime") Date updateTime);

    /**
     * 获取旧耗材信息
     *
     * @param orderId 订单id
     * @return
     */
    List<String> getOldConsumables(@Param("orderId") String orderId);

    /**
     * 删除旧的耗材信息
     *
     * @param deleteOldConsumableIds 耗材信息
     * @param orderId                订单id
     * @param updateTime             时间
     */
    void deleteOldConsumableInfo(@Param("oldConsumableIds") List<String> deleteOldConsumableIds,
                                 @Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * 更新增加
     *
     * @param goodsInfoList 耗材信息
     * @param orderId       订单id
     * @param updateTime    更新时间
     */
    void updateInsertConsumableId(@Param("goodsInfoList") List<GeneticOrderGoodsInfoDto> goodsInfoList,
                                  @Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * 计算佣金
     *
     * @param paramDto 参数
     * @return
     */
    OrderCommissionInfo calculateCommission(CalculateCommissionParamDto paramDto);

    /**
     * @param id             订单id
     * @param cancelReason   取消原因
     * @param updateDateTime 更新时间
     * @param cancelType     取消类型
     * @return void
     * @description 取消testing_order表
     * @author maodi
     * @createDate 2018/9/29 11:16
     */
    void cancelTestingOrder(@Param("id") String id, @Param("cancelReason") String cancelReason, @Param("cancelType")
            Integer cancelType, @Param("updateDateTime") Date updateDateTime);

    /**
     * @param geneticTestingOrderId 订单关联id
     * @param updateDateTime        更新时间
     * @return void
     * @description 取消testing_order_addtion_a表
     * @author maodi
     * @createDate 2018/9/29 11:17
     */
    void cancelTestingOrderAddtionA(@Param("geneticTestingOrderId") String geneticTestingOrderId, @Param
            ("updateDateTime") Date updateDateTime);

    /**
     * @param orderId 订单id
     * @description 获取基因检测单基础信息
     * @author maodi
     * @createDate 2018/9/29 15:22
     */
    BaseInfoDataDto getBaseInfoById(@Param("orderId") String orderId);

    /**
     * 获取订单支付类型
     *
     * @param orderId 订单id
     * @return
     */
    String getOrderPayType(@Param("orderId") String orderId);

    /**
     * 获取订单编号和图片
     *
     * @param orderId 订单ID
     * @return
     */
    OrderSampleImageAndNumber getSampleImageAndOrderNo(@Param("orderId") String orderId);

    /**
     * 获取检测机构信息
     *
     * @param packageIds 套餐ID
     * @return
     */
    List<String> getAgencys(@Param("packageIds") List<String> packageIds);

    /**
     * 删除旧机构
     *
     * @param orderId    订单id
     * @param updateTime 时间
     */
    void updateOldAgencys(@Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * 插入机构信息
     *
     * @param agencyId      机构id
     * @param orderId       订单id
     * @param updateTime    更新时间
     * @param requisitionNo 申请单编号
     */
    void insertRequisition(@Param("agencyId") String agencyId, @Param("orderId") String orderId,
                           @Param("updateTime") Date updateTime, @Param("requisitionNo") String requisitionNo);

    /**
     * 更新
     *
     * @param packageIds
     */
    void updateOrderPackageAgency(@Param("packageIds") List<String> packageIds);

    /**
     * 获取dcw信息
     *
     * @param orderId
     * @return
     */
    UploadDcwDetailsDto getDcwInfoByOrderId(@Param("orderId") String orderId);

    /**
     * 上传dcw
     *
     * @param testingOrder dcw信息
     * @param date
     */
    void updateDcwInfo(@Param("dcw") UploadDcwDetailsDto testingOrder, @Param("createTime") Date date);

    /**
     * @param testingOrder dcw信息
     * @param date         时间
     * @return void
     * @description 插入dcw信息
     * @author maodi
     * @createDate 2019/1/28 18:03
     */
    void insertDcwInfo(@Param("dcw") UploadDcwDetailsDto testingOrder, @Param("createTime") Date date);

    /**
     * 校验订单是否存在
     *
     * @param tableName 表名
     * @param fieldName 字段名
     * @param orderId   订单id
     * @return
     */
    Boolean orderIsExists(@Param("tableName") String tableName, @Param("fieldName") String fieldName,
                          @Param("orderId") String orderId);

    /**
     * 申请录入
     *
     * @param orderId 订单id
     */
    void updateDcwEntry(@Param("orderId") String orderId);

    /**
     * 更新物流信息
     *
     * @param expressImgs 签收凭证
     * @param orderId     订单id
     * @param expressIds  物流信息
     */
    void updateExpressDelivery(@Param("expressImgs") String expressImgs, @Param("orderId") String orderId,
                               @Param("expressIds") List<String> expressIds);

    /**
     * 获取物流订单信息
     *
     * @param orderId 订单id
     * @return
     */
    Boolean getExpressDelivery(@Param("orderId") String orderId);

    /**
     * 更新主订单完成
     *
     * @param orderId 订单id
     * @param date
     */
    void updateMainOrderFinished(@Param("orderId") String orderId, @Param("updateTime") Date date);

    /**
     * @param orderId 订单id
     * @param date    更新时间
     * @return void
     * @description 更新主订单为待发货
     * @author maodi
     * @createDate 2018/11/13 16:18
     */
    void updateMainOrderDelivery(@Param("orderId") String orderId, @Param("updateDateTime") Date date);

    /**
     * 获取申请单信息
     *
     * @param orderId 订单id
     * @return
     */
    List<GeneRequisitionData> getTestRequisitionDataByOrderId(@Param("orderId") String orderId);

    /**
     * 更新检测申请单信息
     *
     * @param orderId    订单id
     * @param orgId      机构id
     * @param data       数据
     * @param orderId    订单id
     * @param orgId      机构id
     * @param data       数据
     * @param updateTime
     */
    void updateTestRequisitionData(@Param("orderId") String orderId, @Param("orgId") String orgId,
                                   @Param("data") String data, @Param("updateTime") Date updateTime);

    /**
     * 更新报告状态
     *
     * @param orderPackageDetail
     */
    void updateReportStatus(OrderPackageDetail orderPackageDetail);

    /**
     * @param id   订单id
     * @param date 患者确认时间
     * @return void
     * @description 根据订单id确认患者信息
     * @author maodi
     * @createDate 2018/10/8 11:18
     */
    void updatePatientInfoConfirm(@Param("id") String id, @Param("date") Date date);

    /**
     * @param orderNo 订单号
     * @return com.hsgene.order.domain.disease.GeneOrder
     * @description 获取患者确认信息
     * @author maodi
     * @createDate 2018/9/30 15:44
     */
    GeneOrder getPatientInfoConfirmByOrderNo(@Param("orderNo") String orderNo);

    /**
     * @param id 订单id
     * @return java.lang.String
     * @description 根据订单id获取患者电话
     * @author maodi
     * @createDate 2018/9/30 15:59
     */
    String getPatientPhoneById(@Param("id") String id);

    String getTestItemsByOrderNo(@Param("orderNo") String orderNo);

    /**
     * 校验订单状态
     *
     * @param orderId 订单id
     * @param status  状态
     * @return
     */
    Integer checkOrderStatus(@Param("orderId") String orderId, @Param("status") Integer status);

    /**
     * 付款待分配订单数量
     *
     * @param condition 查询条件
     * @return
     */
    List<Integer> distributeOrderCount(@Param("condition") DistributeOrderCondition condition);

    /**
     * 付款待分配订单列表
     *
     * @param condition 查询条件
     * @return
     */
    List<DistributeOrdersDto> distributeOrders(@Param("condition") DistributeOrderCondition condition);

    /**
     * @Description 待分配订单详情
     * @Author jcl
     * @CreateDate 2018/10/16 17:38
     * @Param id 订单id
     * @Return
     */
    DistributeOrderDetailInfoDto distributeOrderDetail(@Param("id") String id);

    /***
     * @Description 分配地服
     * @Author jcl
     * @CreateDate 2018/10/18 15:45
     * @param orderId 订单id
     * @Param distributorId 分配人员id
     * @Param assigneeId 地服id
     * @Param status 状态
     * @Return
     */
    void distributeDifu(@Param("orderId") String orderId, @Param("distributorId") String distributorId,
                        @Param("assigneeId") String assigneeId, @Param("status") int status, @Param("date") Date date);

    /***
     * 分配地服时将地服id录入A表
     * @author jcl
     * @date 2018/11/13 17:09
     * @param orderId 订单id
     * @param assigneeId 地服id
     * @return
     */
    void updateOrderA(@Param("orderId") String orderId, @Param("assigneeId") String assigneeId);

    /**
     * 插入病例类型
     *
     * @param newOrderId
     * @param caseType
     */
    void insertDcwType(@Param("orderId") String newOrderId, @Param("caseType") String caseType);

    /**
     * @param newOrderId 新订单id
     * @param caseType   病历类型
     * @param oldOrderId 老订单id
     * @return void
     * @description 更新dcw表病历类型
     * @author maodi
     * @createDate 2019/1/28 17:56
     */
    void updateDcwType(@Param("newOrderId") String newOrderId, @Param("caseType") String caseType, @Param
            ("oldOrderId") String oldOrderId);

    /**
     * 校验医生id
     *
     * @param orderId
     * @return
     */
    String checkDoctorInfo(@Param("orderId") String orderId);

    /**
     * 获取物流信息
     *
     * @param orderId   订单id
     * @param productId 套餐id
     * @return
     */
    OrderProductLogisticsInfoDto getLogisticsNoAndCompany(@Param("orderId") String orderId,
                                                          @Param("productId") String productId);

    /**
     * 获取订单物流
     *
     * @param orderId 订单id
     * @return
     */
    List<OrderLogisticsInfoDto> getLogisticsDetail(@Param("orderId") String orderId);

    /**
     * 获取库存数量
     *
     * @param goodsId 耗材id
     * @return
     */
    Integer getGoodsAmount(@Param("goodsId") String goodsId);

    /**
     * 更新申请历史
     *
     * @param goodsInfoDtos 耗材信息
     * @param userId        用户id
     * @param updateTime    更新时间
     */
    void updateGoodsApplyHistory(@Param("goodsInfoDtos") List<GeneticOrderGoodsInfoDto> goodsInfoDtos,
                                 @Param("userId") String userId, @Param("updateTime") Date updateTime);

    /**
     * 根据报告名称查询检测报告
     *
     * @param doctorId   医生id
     * @param reportName 报告名称
     * @return 检测报告
     */
    String queryOrderPackageReport(
            @Param("doctorId") String doctorId,
            @Param("reportName") String reportName);

    /**
     * 查询dcw信息
     *
     * @param orderId 订单id
     * @return
     */
    DcwImageModel getDcwInfos(@Param("orderId") String orderId);

    /**
     * 校验样本类型所填参数
     *
     * @param sampleId
     * @return
     */
    String checkParamsIsNull(@Param("sampleId") String sampleId);

    /**
     * 根据订单id和套餐id改package报告的状态
     *
     * @param orderPackageDetail
     * @return
     * @author FX
     * @date 2018/11/8 11:08
     */
    void updateOrderPackageStatus(@Param("orderPackageDetail") OrderPackageDetail orderPackageDetail, @Param
            ("status") Integer status);

    /**
     * 更新订单退款相关信息
     *
     * @param order 订单退款信息
     */
    void updateOrderRefund(@Param("order") GeneticTestingOrder order);

    /***
     * 订单操作记录
     * @author jcl
     * @date 2018/11/13 9:54
     * @param geneticOrderOperationDetail
     * @return
     */
    void orderOperationLog(GeneticOrderOperationDetail geneticOrderOperationDetail);

    /**
     * 校验发放积分
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkPointSend(@Param("orderId") String orderId);

    /**
     * 判断积分是否发放
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkPointSendStatus(@Param("orderId") String orderId);

    /**
     * 更新订单收货状态
     *
     * @param testingOrder 订单信息
     */
    void updateOrderReceipt(@Param("testingOrder") GeneticTestingOrder testingOrder);

    /**
     * 发放积分
     *
     * @param orderId 订单id
     * @param date
     * @return
     */
    Boolean updatePointStatus(@Param("orderId") String orderId, @Param("date") Date date);

    /**
     * 保存积分给医生
     *
     * @param difuId     订单id
     * @param date       时间
     * @param experience 经验值
     */
    void saveUserPoint(@Param("difuId") String difuId, @Param("date") Date date,
                       @Param("experience") Integer experience);

    /**
     * @param expressDelivery
     * @return
     * @author FX
     * @date 2018/11/14 12:06
     */
    void groundDelivery(GeneticTestingExpressDelivery expressDelivery);

    /***
     * 地管审核
     * @author jcl
     * @date 2018/11/26 13:49
     * @param orderId
     * @param reason
     * @return
     */
    void groundManageConfirm(@Param("orderId") String orderId, @Param("status") int status,
                             @Param("reason") String reason, @Param("date") Date date);

    /**
     * @param patientName 患者姓名
     * @return int
     * @description 根据患者姓名获取该患者订单的数量
     * @author maodi
     * @createDate 2018/11/26 13:58
     */
    int queryOrderCountByPatientName(@Param("patientName") String patientName);

    /**
     * @param date 更新时间
     * @param id   订单id
     * @return void
     * @description 发放奖励，改变奖励标记状态
     * @author maodi
     * @createDate 2018/11/26 14:59
     */
    void updateFirstSingleAwardTo2(@Param("updateDateTime") Date date, @Param("id") String id);

    /**
     * @param date 更新时间
     * @param id   订单id
     * @return void
     * @description 改变A表更新时间
     * @author maodi
     * @createDate 2018/11/26 15:00
     */
    void updateAUpdateDateTime(@Param("updateDateTime") Date date, @Param("id") String id);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.console.OrderUpdateRealPriceDto
     * @description 根据订单id查询修改实际价格信息
     * @author maodi
     * @createDate 2018/11/28 10:44
     */
    OrderUpdateRealPriceDto queryUpdateRealPriceDto(@Param("orderId") String orderId);

    /**
     * @param orderId        订单id
     * @param realCharges    实际价格
     * @param updateDateTime 更新时间
     * @return
     * @description 修改实际价格
     * @author maodi
     * @createDate 2018/11/28 10:46
     */
    void updateTotalCharges(@Param("orderId") String orderId, @Param("realCharges") double realCharges, @Param
            ("updateDateTime") Date updateDateTime);

    /**
     * @param realCharge 套餐实际价格
     * @param packageId  套餐id
     * @param orderId    订单id
     * @return void
     * @description 修改套餐实际价格
     * @author maodi
     * @createDate 2019/1/18 10:48
     */
    void updatePackageCharges(@Param("realCharge") Double realCharge, @Param("packageId") String packageId, @Param
            ("orderId") String orderId);

    /**
     * @param updateDateTime 更新时间
     * @param orderId        订单id
     * @return void
     * @description 修改主表时间
     * @author maodi
     * @createDate 2019/1/18 10:49
     */
    void updateOrderUpdateDateTime(@Param("updateDateTime") Date updateDateTime, @Param("orderId") String orderId);

    /**
     * @param orderId 订单id
     * @return java.lang.Integer
     * @description 根据订单id查询订单来源
     * @author maodi
     * @createDate 2018/11/28 11:10
     */
    Integer queryOrderOrigin(@Param("orderId") String orderId);

    /**
     * 根据地址id获取收货人地址
     *
     * @param adressId
     * @return
     * @author FX
     * @date 2018/12/7 13:53
     */
    UserMallAddress getUserMallAdress(String adressId);

    /**
     * 获取订单来源
     *
     * @param oldOrderId
     * @return
     */
    Integer getOrderPlatform(@Param("orderId") String oldOrderId);

    /**
     * 获取小程序旧订单信息
     *
     * @param oldOrderId 旧ID
     * @return
     */
    Map<String, Object> getAppOrderInfo(@Param("oldOrderId") String oldOrderId);

    /**
     * 更新
     *
     * @param map
     * @param newOrderId
     */
    void updateAppOrderInfo(@Param("map") Map<String, Object> map, @Param("newOrderId") String newOrderId);

    /**
     * @param orderId 订单id
     * @return int  订单状态
     * @description 根据订单id获取订单状态
     * @author maodi
     * @createDate 2018/12/13 11:47
     */
    Integer getOrderStatusByOrderId(@Param("orderId") String orderId);

    /**
     * 获取套餐价格
     *
     * @param packId
     * @return
     */
    Double getPackPrice(@Param("packId") String packId);

    /**
     * @param totalCharges   总费用
     * @param patientName    患者姓名
     * @param updateDateTime 更新时间
     * @param status         订单状态
     * @param id             订单id
     * @return void
     * @description 花生仁和金琉璃确认主订单表
     * @author maodi
     * @createDate 2018/12/19 10:06
     */
    void confirmOrderFromPG(@Param("totalCharges") double totalCharges, @Param("patientName") String patientName,
                            @Param("updateDateTime") Date updateDateTime, @Param("status") Integer status, @Param("id")
                                    String id);

    /**
     * @param originalCost 订单原始费用
     * @param payerType    付款人
     * @param orderId      订单id
     * @return void
     * @description 花生仁和金琉璃确认B订单
     * @author maodi
     * @createDate 2018/12/19 10:08
     */
    void confirmBOrderFromPG(@Param("originalCost") Double originalCost, @Param("payerType") Integer payerType, @Param
            ("orderId") String orderId);

    /**
     * @param id               订单id
     * @param orderNo          订单编号
     * @param totalCharges     总费用
     * @param patientName      患者姓名
     * @param status           订单状态
     * @param orderOrigin      订单来源
     * @param creatorId        创建人
     * @param updateDateTime   更新时间
     * @param firstSingleAward 首单奖励
     * @return void
     * @description 花生仁和金琉璃创建主订单表
     * @author maodi
     * @createDate 2018/12/19 13:45
     */
    void createOrderFromPG(
            @Param("id") String id,
            @Param("orderNo") String orderNo,
            @Param("totalCharges") Double totalCharges,
            @Param("patientName") String patientName,
            @Param("status") Integer status,
            @Param("orderOrigin") Integer orderOrigin,
            @Param("creatorId") String creatorId,
            @Param("updateDateTime") Date updateDateTime,
            @Param("firstSingleAward") Integer firstSingleAward);

    /**
     * @param id             a表逻辑主键
     * @param orderId        订单id
     * @param memberId       原始地服id
     * @param updateDateTime 更新时间
     * @return void
     * @description 花生仁和金琉璃创建A订单表
     * @author maodi
     * @createDate 2018/12/19 14:39
     */
    void createAOrderFromPG(@Param("id") String id, @Param("orderId") String orderId, @Param("memberId") String
            memberId, @Param("updateDateTime") Date updateDateTime);


    /**
     * @param id           b表逻辑主键
     * @param orderId      订单id
     * @param originalCost 订单原始费用
     * @param payerType    付款人
     * @return void
     * @description 花生仁和金琉璃创建B订单表
     * @author maodi
     * @createDate 2018/12/19 13:45
     */
    void createBOrderFromPG(@Param("id") String id, @Param("orderId") String orderId, @Param("originalCost") Double
            originalCost, @Param("payerType") Integer payerType);

    /**
     * @param id 订单id
     * @return java.lang.String
     * @description 获取订单的编号
     * @author maodi
     * @createDate 2018/12/19 10:20
     */
    String getOrderNoById(@Param("id") String id);

    /**
     * @param orderId 订单id
     * @return java.lang.String
     * @description 获取地服的id
     * @author maodi
     * @createDate 2018/12/19 10:21
     */
    String getUserIdById(@Param("orderId") String orderId);

    /**
     * 异步更新套餐购物数量
     *
     * @param packageId 套餐id
     * @param count     购买数量
     */
    void updatePackageBuyCount(@Param("packageId") String packageId, @Param("count") int count);

    /**
     * 获取发放积分信息
     *
     * @param orderId 订单id
     * @return
     */
    Map<String, Object> getSendPointInfo(@Param("orderId") String orderId);

    /***
     * 获取套餐检测成本
     * @author jcl
     * @date 2018/12/27 11:49
     * @param packageId 套餐id
     * @param agencyId 机构id
     * @return
     */
    BigDecimal packageCost(@Param("packageId") String packageId, @Param("agencyId") String agencyId);

    /**
     * @param status   异常发生之前的订单状态
     * @param dateTime 修改时间
     * @param id       订单id
     * @return void
     * @description 修改异常订单的异常发生之前的订单状态
     * @author maodi
     * @createDate 2018/12/29 10:45
     */
    void updateBeforeExceptionStatus(@Param("status") Integer status, @Param("dateTime") Date dateTime, @Param("id")
            String id);

    /**
     * 判断订单是否支付
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkOrderIsPay(@Param("orderId") String orderId);

    /**
     * 患者付款之后确认订单
     *
     * @param confirmedInfo 确认信息
     */
    void updateOrderTestInfo(PatientConfirmedInfo confirmedInfo);

    /**
     * 删除订单
     *
     * @param orderId
     */
    void deleteOrderId(@Param("orderId") String orderId);

    /**
     * 更新订单（套餐变更信息完善）
     *
     * @param order 订单信息
     */
    void updateOrderForInterchange(@Param("order") GeneticTestingOrder order);

    /**
     * 获取订单创建时间
     *
     * @param oldOrderId 订单id
     * @return
     */
    Date getOrderCreateTime(@Param("oldOrderId") String oldOrderId);

    /**
     * 获取pdf图片信息
     *
     * @param orderId 订单id
     * @return
     */
    List<GeneTestPdfInfo> getTestPdf(@Param("orderId") String orderId);

    /**
     * 更新
     *
     * @param oldOrderId 旧订单ID
     * @param newOrderId 新订单id
     */
    void updatePayment(@Param("oldOrderId") String oldOrderId, @Param("newOrderId") String
            newOrderId);

    /**
     * 平台发货给用户更新订单状态
     *
     * @param id
     * @param status
     * @param date
     * @return
     * @author FX
     * @date 2019/1/8 15:10
     */
    void updateTestingOrderStatusSendToUser(@Param("id") String id, @Param("status") int status, @Param("date") Date
            date);


    /**
     * 获取患者展示信息
     *
     * @param orderId 订单id
     * @return
     */
    GeneticTestPatientShowInfo getOrderDetailsByOrderId(@Param("orderId") String orderId);

    /**
     * 更新OrderB表
     *
     * @param newOrderId  新id
     * @param oldPrice    原始价格
     * @param patientInfo 患者信息
     * @param payerType   支付类型
     * @param oldOrderId  旧订单id
     */
    void updateOrderB(@Param("newOrderId") String newOrderId, @Param("oldPrice") Double oldPrice,
                      @Param("patientInfo") GeneticCompletePatientInfo patientInfo,
                      @Param("payerType") Integer payerType, @Param("oldOrderId") String oldOrderId);

    void updateOperationDetail(@Param("oldOrderId") String oldOrderId, @Param("newOrderId") String newOrderId);

    /**
     * 更新订单信息（订单检测超期）
     *
     * @param order 订单信息
     */
    void updateOrderForPostpone(@Param("order") GeneticTestingOrder order);

    /***
     * 根据订单编号获取订单id
     * @author jcl
     * @date 2019/1/21 15:06
     * @param orderNo
     * @return
     */
    String getIdByOrderNo(@Param("orderNo") String orderNo);

    /**
     * 校验状态是否有效
     *
     * @param orderId 订单id
     * @param status  状态值
     * @return
     */
    Integer checkOrderStatusIsEffect(@Param("orderId") String orderId, @Param("status") Integer[] status);

    /**
     * 查看样本图片是否存在
     *
     * @param orderId 订单id
     * @return
     */
    OrderCheckInfoDto checkOrderSample(@Param("orderId") String orderId);

    /**
     * 判断订单是否标记
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkOrderIsSign(@Param("orderId") String orderId);

    /**
     * 变更套餐A表更新
     *
     * @param addtionA 更新信息
     */
    void updateAdditionAForInterchange(@Param("addtionA") GeneticTestingOrderAddtionA addtionA);

    /**
     * 订单超时自动关闭
     *
     * @param order 订单信息
     */
    void autoCloseOrder(@Param("order") GeneticTestingOrder order);

    /**
     * @param orderId 订单id
     * @return java.lang.Integer
     * @description 校验订单状态是否在待地管确认、待确认样本、报告待上传、报告待审核状态之间
     * @author maodi
     * @createDate 2019/1/28 14:19
     */
    Integer checkSecondPerfectOrderStatus(@Param("orderId") String orderId);

    /**
     * @param newOrderId 老订单id
     * @param oldOrderId 新订单id
     * @return void
     * @description 更新dcw表订单id
     * @author maodi
     * @createDate 2019/1/28 16:59
     */
    void updateOrderDcw(@Param("newOrderId") String newOrderId, @Param("oldOrderId") String oldOrderId);

    /**
     * @param newOrderId
     * @param oldOrderId
     * @return void
     * @description 更新dcw_rollback表订单id
     * @author maodi
     * @createDate 2019/1/28 17:00
     */
    void updateOrderDcwRollback(@Param("newOrderId") String newOrderId, @Param("oldOrderId") String oldOrderId);

    /**
     * 查询套餐物流
     *
     * @param geneticTestingOrderId
     * @return
     * @author FX
     * @date 2019/1/28 17:27
     */
    OrderCheckInfoDto checkPackageDeliver(String geneticTestingOrderId);

    /***
     * 获取订单套餐变更信息
     * @author jcl
     * @date 2019/1/29 14:07
     * @param orderId 订单id
     * @return
     */
    List<ConsoleOrderInterchangeDto> consoleOrderInterchanges(String orderId);

    /***
     * 根据订单id和套餐id查询数据
     * @author jcl
     * @date 2019/1/29 15:21
     * @param orderId 订单id
     * @param packageId 套餐id
     * @return
     */
    ConsoleOrderInterchangeDto orderInterchange(@Param("orderId") String orderId, @Param("packageId") String packageId);

    /**
     * @param packageIds 套餐id链表
     * @return java.util.List<com.hsgene.order.dto.peanut.ProductInfoDto>
     * @description 根据套餐ids获取商品的信息
     * @author maodi
     * @createDate 2019/1/31 14:37
     */
    List<ProductInfoDto> getProductInfoByPackageIds(@Param("packageIds") List<String> packageIds);

    /**
     * @param newOrderId 新订单id
     * @param oldOrderId 老订单id
     * @return void
     * @description 将老的订单id更新为新的订单id
     * @author maodi
     * @createDate 2019/1/31 15:10
     */
    void updateAddtionAOrderId(@Param("newOrderId") String newOrderId, @Param("oldOrderId") String oldOrderId);

    /**
     * @param orderId 订单id
     * @return java.lang.String
     * @description 根据订单id获取订单的病例类型
     * @author maodi
     * @createDate 2019/1/31 15:19
     */
    String getCaseTypeByOrderId(@Param("orderId") String orderId);

    /**
     * @param orderId 订单id
     * @return java.lang.Integer
     * @description 查询addtionA表是否有该订单
     * @author maodi
     * @createDate 2019/1/31 15:56
     */
    Integer getCountAByOrderId(@Param("orderId") String orderId);

    /**
     * @param oldOrderId        老订单id
     * @param newOrderId        新订单id
     * @param clinicalDiagnosis 临床诊断
     * @param userId            用户id
     * @param createTime        创建时间
     * @param updateTime        更新时间
     * @param diseaseIds        疾病id数组字符串
     * @param diseaseNames      疾病名称数组字符串
     * @return void
     * @description 更新addtionA表中订单id
     * @author maodi
     * @createDate 2019/1/31 15:53
     */
    void updateOrderAddtionA(
            @Param("newOrderId") String newOrderId,
            @Param("clinicalDiagnosis") String clinicalDiagnosis,
            @Param("userId") String userId,
            @Param("createTime") Date createTime,
            @Param("updateTime") Date updateTime,
            @Param("diseaseIds") String diseaseIds,
            @Param("diseaseNames") String diseaseNames,
            @Param("oldOrderId") String oldOrderId);

    /**
     * @param orderId 订单id
     * @return java.lang.String
     * @description 获取订单快递图片
     * @author maodi
     * @createDate 2019/2/20 13:42
     */
    String selectCourierImagesUrl(@Param("orderId") String orderId);

    /**
     * @param orderId 订单id
     * @return
     * @description 查询订单快递公司是否为空
     * @author maodi
     * @createDate 2019/2/20 14:05
     */
    List<String> selectCourierCompanyName(@Param("orderId") String orderId);
}
